home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / lib / calc / qmath.h < prev    next >
C/C++ Source or Header  |  1995-07-17  |  9KB  |  224 lines

  1. /*
  2.  * Copyright (c) 1993 David I. Bell
  3.  * Permission is granted to use, distribute, or modify this source,
  4.  * provided that this copyright notice remains intact.
  5.  *
  6.  * Data structure declarations for extended precision rational arithmetic.
  7.  */
  8.  
  9. #ifndef    QMATH_H
  10. #define    QMATH_H
  11.  
  12. #include "zmath.h"
  13.  
  14.  
  15. /*
  16.  * Rational arithmetic definitions.
  17.  */
  18. typedef struct {
  19.     ZVALUE num;        /* numerator (containing sign) */
  20.     ZVALUE den;        /* denominator (always positive) */
  21.     long links;        /* number of links to this value */
  22. } NUMBER;
  23.  
  24.  
  25. /*
  26.  * Input. output, allocation, and conversion routines.
  27.  */
  28. extern NUMBER *qalloc MATH_PROTO((void));
  29. extern NUMBER *qcopy MATH_PROTO((NUMBER *q));
  30. extern NUMBER *iitoq MATH_PROTO((long i1, long i2));
  31. extern NUMBER *atoq MATH_PROTO((char *str));
  32. extern NUMBER *itoq MATH_PROTO((long i));
  33. extern long qtoi MATH_PROTO((NUMBER *q));
  34. extern long qparse MATH_PROTO((char *str, int flags));
  35. extern void qfreenum MATH_PROTO((NUMBER *q));
  36. extern void qprintnum MATH_PROTO((NUMBER *q, int mode));
  37. extern void qprintff MATH_PROTO((NUMBER *q, long width, long precision));
  38. extern void qprintfe MATH_PROTO((NUMBER *q, long width, long precision));
  39. extern void qprintfr MATH_PROTO((NUMBER *q, long width, BOOL force));
  40. extern void qprintfd MATH_PROTO((NUMBER *q, long width));
  41. extern void qprintfx MATH_PROTO((NUMBER *q, long width));
  42. extern void qprintfb MATH_PROTO((NUMBER *q, long width));
  43. extern void qprintfo MATH_PROTO((NUMBER *q, long width));
  44.  
  45.  
  46.  
  47. /*
  48.  * Basic numeric routines.
  49.  */
  50. extern NUMBER *qaddi MATH_PROTO((NUMBER *q, long i));
  51. extern NUMBER *qmuli MATH_PROTO((NUMBER *q, long i));
  52. extern NUMBER *qdivi MATH_PROTO((NUMBER *q, long i));
  53. extern NUMBER *qadd MATH_PROTO((NUMBER *q1, NUMBER *q2));
  54. extern NUMBER *qsub MATH_PROTO((NUMBER *q1, NUMBER *q2));
  55. extern NUMBER *qmul MATH_PROTO((NUMBER *q1, NUMBER *q2));
  56. extern NUMBER *qdiv MATH_PROTO((NUMBER *q1, NUMBER *q2));
  57. extern NUMBER *qquo MATH_PROTO((NUMBER *q1, NUMBER *q2));
  58. extern NUMBER *qmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  59. extern NUMBER *qmin MATH_PROTO((NUMBER *q1, NUMBER *q2));
  60. extern NUMBER *qmax MATH_PROTO((NUMBER *q1, NUMBER *q2));
  61. extern NUMBER *qand MATH_PROTO((NUMBER *q1, NUMBER *q2));
  62. extern NUMBER *qor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  63. extern NUMBER *qxor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  64. extern NUMBER *qpowermod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  65. extern NUMBER *qpowi MATH_PROTO((NUMBER *q1, NUMBER *q2));
  66. extern NUMBER *qsquare MATH_PROTO((NUMBER *q));
  67. extern NUMBER *qneg MATH_PROTO((NUMBER *q));
  68. extern NUMBER *qsign MATH_PROTO((NUMBER *q));
  69. extern NUMBER *qint MATH_PROTO((NUMBER *q));
  70. extern NUMBER *qfrac MATH_PROTO((NUMBER *q));
  71. extern NUMBER *qnum MATH_PROTO((NUMBER *q));
  72. extern NUMBER *qden MATH_PROTO((NUMBER *q));
  73. extern NUMBER *qinv MATH_PROTO((NUMBER *q));
  74. extern NUMBER *qabs MATH_PROTO((NUMBER *q));
  75. extern NUMBER *qinc MATH_PROTO((NUMBER *q));
  76. extern NUMBER *qdec MATH_PROTO((NUMBER *q));
  77. extern NUMBER *qshift MATH_PROTO((NUMBER *q, long n));
  78. extern NUMBER *qtrunc MATH_PROTO((NUMBER *q1, NUMBER *q2));
  79. extern NUMBER *qround MATH_PROTO((NUMBER *q, long places));
  80. extern NUMBER *qbtrunc MATH_PROTO((NUMBER *q1, NUMBER *q2));
  81. extern NUMBER *qbround MATH_PROTO((NUMBER *q, long places));
  82. extern NUMBER *qscale MATH_PROTO((NUMBER *q, long i));
  83. extern BOOL qdivides MATH_PROTO((NUMBER *q1, NUMBER *q2));
  84. extern BOOL qcmp MATH_PROTO((NUMBER *q1, NUMBER *q2));
  85. extern BOOL qcmpi MATH_PROTO((NUMBER *q, long i));
  86. extern FLAG qrel MATH_PROTO((NUMBER *q1, NUMBER *q2));
  87. extern FLAG qreli MATH_PROTO((NUMBER *q, long i));
  88. extern BOOL qisset MATH_PROTO((NUMBER *q, long i));
  89.  
  90.  
  91. /*
  92.  * More complicated numeric functions.
  93.  */
  94. extern NUMBER *qcomb MATH_PROTO((NUMBER *q1, NUMBER *q2));
  95. extern NUMBER *qgcd MATH_PROTO((NUMBER *q1, NUMBER *q2));
  96. extern NUMBER *qlcm MATH_PROTO((NUMBER *q1, NUMBER *q2));
  97. extern NUMBER *qfact MATH_PROTO((NUMBER *q));
  98. extern NUMBER *qpfact MATH_PROTO((NUMBER *q));
  99. extern NUMBER *qminv MATH_PROTO((NUMBER *q1, NUMBER *q2));
  100. extern NUMBER *qfacrem MATH_PROTO((NUMBER *q1, NUMBER *q2));
  101. extern NUMBER *qperm MATH_PROTO((NUMBER *q1, NUMBER *q2));
  102. extern NUMBER *qgcdrem MATH_PROTO((NUMBER *q1, NUMBER *q2));
  103. extern NUMBER *qlowfactor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  104. extern NUMBER *qfib MATH_PROTO((NUMBER *q));
  105. extern NUMBER *qcfappr MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  106. extern NUMBER *qisqrt MATH_PROTO((NUMBER *q));
  107. extern NUMBER *qjacobi MATH_PROTO((NUMBER *q1, NUMBER *q2));
  108. extern NUMBER *qiroot MATH_PROTO((NUMBER *q1, NUMBER *q2));
  109. extern NUMBER *qbappr MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  110. extern NUMBER *qlcmfact MATH_PROTO((NUMBER *q));
  111. extern NUMBER *qminmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  112. extern NUMBER *qredcin MATH_PROTO((NUMBER *q1, NUMBER *q2));
  113. extern NUMBER *qredcout MATH_PROTO((NUMBER *q1, NUMBER *q2));
  114. extern NUMBER *qredcmul MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  115. extern NUMBER *qredcsquare MATH_PROTO((NUMBER *q1, NUMBER *q2));
  116. extern NUMBER *qredcpower MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  117. extern BOOL qprimetest MATH_PROTO((NUMBER *q1, NUMBER *q2));
  118. extern BOOL qissquare MATH_PROTO((NUMBER *q));
  119. extern long qilog2 MATH_PROTO((NUMBER *q));
  120. extern long qilog10 MATH_PROTO((NUMBER *q));
  121. extern BOOL qcmpmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  122. extern BOOL qquomod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER **retdiv,
  123.     NUMBER **retmod));
  124. extern FLAG qnear MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  125. extern FLAG qdigit MATH_PROTO((NUMBER *q, long i));
  126. extern long qprecision MATH_PROTO((NUMBER *q));
  127. extern long qplaces MATH_PROTO((NUMBER *q));
  128. extern long qdigits MATH_PROTO((NUMBER *q));
  129. extern HASH qhash MATH_PROTO((NUMBER *q));
  130. extern void setepsilon MATH_PROTO((NUMBER *q));
  131.  
  132. #if 0
  133. extern NUMBER *qbitvalue MATH_PROTO((long i));
  134. extern NUMBER *qmulmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  135. extern NUMBER *qsquaremod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  136. extern NUMBER *qaddmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  137. extern NUMBER *qsubmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  138. extern NUMBER *qreadval MATH_PROTO((FILE *fp));
  139. extern NUMBER *qnegmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  140. extern BOOL qbittest MATH_PROTO((NUMBER *q, long i));
  141. extern FLAG qtest MATH_PROTO((NUMBER *q));
  142. #endif
  143.  
  144.  
  145. /*
  146.  * Transcendental functions.  These all take an epsilon argument to
  147.  * specify the required accuracy of the calculation.
  148.  */
  149. extern NUMBER *qsqrt MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  150. extern NUMBER *qpower MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  151. extern NUMBER *qroot MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  152. extern NUMBER *qcos MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  153. extern NUMBER *qsin MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  154. extern NUMBER *qexp MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  155. extern NUMBER *qln MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  156. extern NUMBER *qtan MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  157. extern NUMBER *qacos MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  158. extern NUMBER *qasin MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  159. extern NUMBER *qatan MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  160. extern NUMBER *qatan2 MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  161. extern NUMBER *qhypot MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  162. extern NUMBER *qcosh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  163. extern NUMBER *qsinh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  164. extern NUMBER *qtanh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  165. extern NUMBER *qacosh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  166. extern NUMBER *qasinh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  167. extern NUMBER *qatanh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  168. extern NUMBER *qlegtoleg MATH_PROTO((NUMBER *q, NUMBER *epsilon, BOOL wantneg));
  169. extern NUMBER *qpi MATH_PROTO((NUMBER *epsilon));
  170.  
  171.  
  172. /*
  173.  * macro expansions to speed this thing up
  174.  */
  175. #define qiszero(q)    (ziszero((q)->num))
  176. #define qisneg(q)    (zisneg((q)->num))
  177. #define qispos(q)    (zispos((q)->num))
  178. #define qisint(q)    (zisunit((q)->den))
  179. #define qisfrac(q)    (!zisunit((q)->den))
  180. #define qisunit(q)    (zisunit((q)->num) && zisunit((q)->den))
  181. #define qisone(q)    (zisone((q)->num) && zisunit((q)->den))
  182. #define qisnegone(q)    (zisnegone((q)->num) && zisunit((q)->den))
  183. #define qistwo(q)    (zistwo((q)->num) && zisunit((q)->den))
  184. #define qiseven(q)    (zisunit((q)->den) && ziseven((q)->num))
  185. #define qisodd(q)    (zisunit((q)->den) && zisodd((q)->num))
  186. #define qistwopower(q)    (zisunit((q)->den) && zistwopower((q)->num))
  187.  
  188. #define qhighbit(q)    (zhighbit((q)->num))
  189. #define qlowbit(q)    (zlowbit((q)->num))
  190. #define qdivcount(q1, q2)    (zdivcount((q1)->num, (q2)->num))
  191. #define qilog(q1, q2)    (zlog((q1)->num, (q2)->num))
  192. #define qlink(q)    ((q)->links++, (q))
  193.  
  194. #define qfree(q)    {if (--((q)->links) <= 0) qfreenum(q);}
  195.  
  196.  
  197. /*
  198.  * Flags for qparse calls
  199.  */
  200. #define QPF_SLASH    0x1    /* allow slash for fractional number */
  201. #define QPF_IMAG    0x2    /* allow trailing 'i' for imaginary number */
  202.  
  203.  
  204. #ifdef VARARGS
  205. extern void qprintf();
  206. #else
  207. extern void qprintf MATH_PROTO((char *, ...));
  208. #endif
  209.  
  210.  
  211. /*
  212.  * constants used often by the arithmetic routines
  213.  */
  214. extern NUMBER _qzero_, _qone_, _qnegone_, _qonehalf_;
  215. extern BOOL _sinisneg_;        /* whether sin(x) < 0 (set by cos(x)) */
  216. extern long _epsilonprec_;    /* binary precision of epsilon */
  217. extern NUMBER *_epsilon_;    /* default error for real functions */
  218. extern long _outdigits_;    /* current output digits for float or exp */
  219. extern int _outmode_;        /* current output mode */
  220.  
  221. #endif
  222.  
  223. /* END CODE */
  224.